﻿
// MFCExp1Dlg.cpp: 实现文件
//

#include "pch.h"
#include "MFCExp1.h"
#include "MFCExp1Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCExp1Dlg 对话框



CMFCExp1Dlg::CMFCExp1Dlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFCEXP1_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCExp1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMFCExp1Dlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON4, &CMFCExp1Dlg::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON1, &CMFCExp1Dlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CMFCExp1Dlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CMFCExp1Dlg::OnBnClickedButton3)
END_MESSAGE_MAP()


// CMFCExp1Dlg 消息处理程序

BOOL CMFCExp1Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	auto p = (CListCtrl*)GetDlgItem(IDC_LIST1);
	p->InsertColumn(0, L"工号", LVCFMT_LEFT, 120);
	p->InsertColumn(1, L"姓名", LVCFMT_LEFT, 120);
	p->InsertColumn(2, L"工资", LVCFMT_LEFT, 120);
	p->InsertColumn(3, L"入职日期", LVCFMT_LEFT, 120);
	p->SetColumnWidth(3, 100);

	p->SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);//更改风格， 网格 和全行选中

	load(); // 读文件加载


	// 设置此对话框的图标。  当应用程序主窗口不是对话框时，框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件，否则返回 TRUE
}

// 如果向对话框添加最小化按钮，则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序，
//  这将由框架自动完成。

void CMFCExp1Dlg::OnPaint()
{

	CPaintDC dc(this); // 用于绘制的设备上下文

		
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCExp1Dlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



//方法
int CMFCExp1Dlg::CheckNumb(const CString& str)
{
	auto p = (CListCtrl*)GetDlgItem(IDC_LIST1);
	int count = p->GetItemCount();
	while (count--) {
		if (p->GetItemText(count, 0) == str)
			return count;
	}
	return -1;
}

void CMFCExp1Dlg::load()
{
	CFile file;
	if (!file.Open(L"./Data.txt", CFile::modeRead))
		return;
	SData d;
	CString str;
	auto p = (CListCtrl*)GetDlgItem(IDC_LIST1);
	p->DeleteAllItems();//先清空
	int i = 0; //行计数
	while (file.Read(&d, sizeof(d)) == sizeof(d))
	{
		str.Format(L"%d", d.nNumb); //sprintf
		p->InsertItem(i, str);
		p->SetItemText(i, 1, d.sName);
		str.Format(L"%g", d.fSalary);
		p->SetItemText(i, 2, str);
		p->SetItemText(i, 3, d.sDate);

		++i;

	}
}


//添加
void CMFCExp1Dlg::OnBnClickedButton1()
{
	auto p = (CListCtrl*)GetDlgItem(IDC_LIST1);
	CString str;
	GetDlgItemText(IDC_EDIT1, str);
	//查询一下工号 是不是已经有了
	int nIndex = CheckNumb(str);
	if (nIndex >= 0) {
		MessageBox(str + L"\n\r你输入的工号已存在！");
		return;
	}


	int nCount = p->GetItemCount();
	//插入 第几行
	p->InsertItem(nCount, str);
	//同一行其他内容
	GetDlgItemText(IDC_EDIT2, str);
	p->SetItemText(nCount, 1, str);
	GetDlgItemText(IDC_EDIT3, str);
	p->SetItemText(nCount, 2, str);
	GetDlgItemText(IDC_DATETIMEPICKER1, str);
	p->SetItemText(nCount, 3, str);

}



//删除
void CMFCExp1Dlg::OnBnClickedButton2()
{
	auto p = (CListCtrl*)GetDlgItem(IDC_LIST1);
	int selCount = p->GetNextItem(-1, LVNI_SELECTED);//或 GetItemCount() 然后 while 
	if (selCount != -1) {
		//提示：
		// 获取表头控件
		CHeaderCtrl* pHeader = p->GetHeaderCtrl();
		int nColumnCount = pHeader->GetItemCount(); // 获取列数
		CString itemText;
		for (int i = 0; i < nColumnCount; ++i) {
			itemText += p->GetItemText(selCount, i); // 获取每列的文本
			itemText += " ";
			// 处理 itemText，例如存储或显示
		}
		if (MessageBox(L"内容" + itemText + "确定删除？", L"提示", MB_YESNO) == IDYES) {
			//删除
			p->DeleteItem(selCount);
		}
	}
	//p->SetSelectionMark();

}

//修改
void CMFCExp1Dlg::OnBnClickedButton3()
{
	auto p = (CListCtrl*)GetDlgItem(IDC_LIST1);
	int selCount = p->GetNextItem(-1, LVNI_SELECTED);
	if (selCount != -1) {
		CString str;
		/*GetDlgItemText(IDC_EDIT1, str);
		p->SetItemText(selCount, 0, str);*/

		GetDlgItemText(IDC_EDIT2, str);
		p->SetItemText(selCount, 1, str);
		GetDlgItemText(IDC_EDIT3, str);
		p->SetItemText(selCount, 2, str);
		GetDlgItemText(IDC_DATETIMEPICKER1, str);
		p->SetItemText(selCount, 3, str);
	}
	else
		MessageBox(L"请选择一行");

}



//保存
void CMFCExp1Dlg::OnBnClickedButton4()
{
	CFile file;
	if (!file.Open(L"./Data.txt", CFile::modeCreate | CFile::modeWrite))
	{
		MessageBox(L"打开文件失败！");
		return;
	}

	auto p = (CListCtrl*)GetDlgItem(IDC_LIST1);
	int i = -1, nCount = p->GetItemCount();
	SData d;
	while (++i < nCount)
	{
		d.nNumb = _tstoi(p->GetItemText(i, 0));  //CString 的核心 WCHAR* pData; operator LPCTSTR;
		_tcscpy(d.sName, p->GetItemText(i, 1));
		//d.sName =  p->GetItemText(i, 1);
		d.fSalary = _tstof(p->GetItemText(i, 2));
		_tcscpy(d.sDate, p->GetItemText(i, 3));
		file.Write(&d, sizeof(d));  //CString的sizeof 返回的是  CString 类型的字节数 不是字符串长度


	}





	file.Close(); //可以不用执行 因为有析构函数
}
